{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Momentum with `Gluon`\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2017-10-22T11:36:06.602619Z",
     "start_time": "2017-10-22T11:36:06.374712Z"
    }
   },
   "outputs": [],
   "source": [
    "import mxnet as mx\n",
    "from mxnet import autograd\n",
    "from mxnet import gluon\n",
    "from mxnet import ndarray as nd\n",
    "import numpy as np\n",
    "import random\n",
    "\n",
    "mx.random.seed(1)\n",
    "random.seed(1)\n",
    "\n",
    "# Generate data.\n",
    "num_inputs = 2\n",
    "num_examples = 1000\n",
    "true_w = [2, -3.4]\n",
    "true_b = 4.2\n",
    "X = nd.random_normal(scale=1, shape=(num_examples, num_inputs))\n",
    "y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_b\n",
    "y += .01 * nd.random_normal(scale=1, shape=y.shape)\n",
    "dataset = gluon.data.ArrayDataset(X, y)\n",
    "\n",
    "net = gluon.nn.Sequential()\n",
    "net.add(gluon.nn.Dense(1))\n",
    "square_loss = gluon.loss.L2Loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['figure.dpi']= 120\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def train(batch_size, lr, mom, epochs, period):\n",
    "    assert period >= batch_size and period % batch_size == 0\n",
    "    net.collect_params().initialize(mx.init.Normal(sigma=1), force_reinit=True)\n",
    "    # SGD with momentum.\n",
    "    trainer = gluon.Trainer(net.collect_params(), 'sgd',\n",
    "                            {'learning_rate': lr, 'momentum': mom})\n",
    "    data_iter = gluon.data.DataLoader(dataset, batch_size, shuffle=True)\n",
    "    total_loss = [np.mean(square_loss(net(X), y).asnumpy())]\n",
    "    \n",
    "    for epoch in range(1, epochs + 1):\n",
    "        # Decay learning rate.\n",
    "        if epoch > 2:\n",
    "            trainer.set_learning_rate(trainer.learning_rate * 0.1)\n",
    "        for batch_i, (data, label) in enumerate(data_iter):\n",
    "            with autograd.record():\n",
    "                output = net(data)\n",
    "                loss = square_loss(output, label)\n",
    "            loss.backward()\n",
    "            trainer.step(batch_size)\n",
    "\n",
    "            if batch_i * batch_size % period == 0:\n",
    "                total_loss.append(np.mean(square_loss(net(X), y).asnumpy()))\n",
    "        print(\"Batch size %d, Learning rate %f, Epoch %d, loss %.4e\" % \n",
    "              (batch_size, trainer.learning_rate, epoch, total_loss[-1]))\n",
    "\n",
    "    print('w:', np.reshape(net[0].weight.data().asnumpy(), (1, -1)), \n",
    "          'b:', net[0].bias.data().asnumpy()[0], '\\n')\n",
    "    x_axis = np.linspace(0, epochs, len(total_loss), endpoint=True)\n",
    "    plt.semilogy(x_axis, total_loss)\n",
    "    plt.xlabel('epoch')\n",
    "    plt.ylabel('loss')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2017-10-22T11:36:07.752280Z",
     "start_time": "2017-10-22T11:36:06.604411Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Batch size 10, Learning rate 0.200000, Epoch 1, loss 3.4819e-04\n",
      "Batch size 10, Learning rate 0.200000, Epoch 2, loss 6.6012e-05\n",
      "Batch size 10, Learning rate 0.020000, Epoch 3, loss 5.0524e-05\n",
      "w: [[ 1.99991047 -3.39920712]] b: 4.19865 \n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nu0p+PSZ59QcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11190ce10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train(batch_size=10, lr=0.2, mom=0.9, epochs=3, period=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Next\n",
    "[Adagrad from scratch](../chapter06_optimization/adagrad-scratch.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For whinges or inquiries, [open an issue on  GitHub.](https://github.com/zackchase/mxnet-the-straight-dope)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
